/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Entidades;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Homero
 */
public class GestorBD {
    
     public int idA=1;
     public int indiceArchivo;
     public int indicePalabra;

    public void setIdA(int idA) {
        this.idA = idA;
    }

    public GestorBD() {
         try
            {
                //s.execute("insert into TSB.PALABRA  (id, descripcion, repeticiones) values (10,'eeee', 15)")
                    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
                    String url = "jdbc:derby://localhost:1527/Vocabulario";
                    Connection con = DriverManager.getConnection(url,"tsb","tsb");
                    java.sql.Statement s = con.createStatement();
                    
                    ResultSet rs=s.executeQuery("select MAX(id) as ID from TSB.PALABRA");
                    if (rs != null ) 
                    {
                        rs.next();
                         indicePalabra=rs.getInt("ID") + 1;
                    
                     }
                    else{indicePalabra=1;}
                    
                    rs=s.executeQuery("select MAX(id) as ID from TSB.ARCHIVO");
                    if (rs != null ) {
                       rs.next();
                        indiceArchivo=rs.getInt("ID")+ 1;
                                }
                    else{indiceArchivo=1;}
                    
                    s.close();
                    con.close();
                    
            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }
        
        
        
        
        
    }
     
    
    
    
    public static DefaultTableModel ConsultaGrillaBD() {
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(GestorBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        String url = "jdbc:derby://localhost:1527/Vocabulario";
        try (Connection con = DriverManager.getConnection(url, "tsb", "tsb"); java.sql.Statement s = con.createStatement()) {
            String query = "SELECT P.DESCRIPCION, P.REPETICIONES, COUNT(*) AS CANTIDAD FROM TSB.PALABRA P INNER JOIN TSB.PALABRASXARCHIVO X ON P.ID=X.ID_PALABRA  GROUP BY P.DESCRIPCION, P.REPETICIONES";
            ResultSet rs = s.executeQuery(query);
            ResultSetMetaData rsm = rs.getMetaData();
            int contadorColumnas = rsm.getColumnCount();
            Object[] objeto = new Object[contadorColumnas];

            for (int i = 0; i < contadorColumnas; i++) {
                objeto[i] = rsm.getColumnLabel(i + 1);
            }
            DefaultTableModel model = new DefaultTableModel();
            model.setColumnIdentifiers(objeto);

            while (rs.next()) {

                Object[] datosFila = new Object[contadorColumnas];
                for (int i = 0; i < contadorColumnas; i++) {
                    datosFila[i] = rs.getObject(i + 1);
                }
                model.addRow(datosFila);
            }
            return model;
        } catch (SQLException ex) {
            Logger.getLogger(GestorBD.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
     
     public boolean verificarArchivo(String direccion, String nombre){
         try
            {
                //s.execute("insert into TSB.PALABRA  (id, descripcion, repeticiones) values (10,'eeee', 15)")
                    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
                    String url = "jdbc:derby://localhost:1527/Vocabulario";
                    Connection con = DriverManager.getConnection(url,"tsb","tsb");
                    java.sql.Statement s = con.createStatement();
                    //s.execute(sql);
                    
                    ResultSet rs=s.executeQuery("select * from TSB.ARCHIVO where DIRECCION='" + direccion + "'");
                    
                    if(rs.next()){
                        return false;
                        
                    }   else{
                        s.execute("insert into TSB.ARCHIVO (ID,direccion, nombre) values("+ indiceArchivo  +",'"+ direccion+ "', '"+nombre+"')");
                        indiceArchivo++;
                        s.close();
                        con.close();
                        return true;
                            }
                    
            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }
         
         finally{}
         return false;
         
         
     }
    
     
     public void insertarPalabraBD(HashMap mapa){
         try
            {
                //s.execute("insert into TSB.PALABRA  (id, descripcion, repeticiones) values (10,'eeee', 15)")
                    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
                    String url = "jdbc:derby://localhost:1527/Vocabulario";
                    Connection con = DriverManager.getConnection(url,"tsb","tsb");
                    //java.sql.Statement s = con.createStatement();
                    //s.execute(sql);
                    con.setAutoCommit(false);
                    PreparedStatement ps1= con.prepareStatement("insert into TSB.PALABRASXARCHIVO values (?,?)");
                    PreparedStatement ps2= con.prepareStatement("UPDATE TSB.PALABRA SET REPETICIONES=REPETICIONES+ ? WHERE DESCRIPCION= ?");
                    PreparedStatement ps3= con.prepareStatement("INSERT INTO TSB.PALABRA (ID, DESCRIPCION, REPETICIONES) VALUES (?,?,?)");
                    PreparedStatement ps4= con.prepareStatement("SELECT ID FROM TSB.PALABRA WHERE DESCRIPCION=?");
                    
                    
                    
                    
                    Iterator it= mapa.entrySet().iterator();
                    while(it.hasNext()){
                        Map.Entry e= (Map.Entry) it.next();
                    
                
 
                    
                    //usar idA en vez de numerico. solo es para prueba
                    

                          //probando sql con parametros
                    //ResultSet rs=s.executeQuery("select ID from TSB.PALABRA where descripcion='" + e.getKey() + "'");
                    
                        
                        
                    ps4.setString(1,(String) e.getKey());
                    ResultSet rs=ps4.executeQuery();
                    if(rs.next()){
                         
                             int clave=rs.getInt("ID");
                        ps2.setString(2, (String) e.getKey());
                        ps2.setInt(1,(int) e.getValue());
                        ps2.executeUpdate();
                        //s.execute("update TSB.PALABRA set repeticiones=repeticiones+"+ e.getValue() + " where descripcion='" + e.getKey() + "'");
                            //Sacamos esta ahora, por que directamente cuando chequeamos ya guardo el ID.
                           //rs=s.executeQuery("select ID from TSB.PALABRA WHERE DESCRIPCION='"+ e.getKey() + "'");
                        ps1.setInt(1, indiceArchivo-1);
                        ps1.setInt(2, clave);
                        ps1.executeUpdate();
                        //s.execute("insert into TSB.PALABRASXARCHIVO values ("+ idA + ", " + clave + ")");
                   
                    }   else{
                        
                        ps3.setInt(1, indicePalabra);
                        ps3.setString(2,(String) e.getKey());
                        ps3.setInt(3,(int) e.getValue());
                        ps3.executeUpdate();
                        //s.execute("insert into TSB.PALABRA  (id, descripcion, repeticiones) values (" + indicePalabra +",'"+ e.getKey() + "'," + e.getValue()+ ")");
                        
                                  //  rs=s.executeQuery("select ID from TSB.PALABRA WHERE DESCRIPCION='"+ e.getKey() + "'");
                                    //rs.next();
                                    //int clave=rs.getInt("ID");
                        
                        ps1.setInt(1, indiceArchivo-1);
                        ps1.setInt(2, indicePalabra);
                        ps1.executeUpdate();
                        //s.execute("insert into TSB.PALABRASXARCHIVO values ("+ idA+ ", " + indicePalabra + ")" );
                        indicePalabra++;
                            
                            }
                                         }
                    con.commit();
                    
                    con.close();
                    
            }
            catch(Exception e)
            {
                   System.out.println(e.getMessage());
            }
     
         
         
     }
    
    
    
    
}



